/**
 * 获取 utf8 字节数组
 * @param str 目标字符串
 * @returns
 */
const getUtf8Bytes = (str: string): number[] => {
  // 创建一个 TextEncoder 实例
  const encoder = new TextEncoder();

  // 编码为 UTF-8 格式的字节数组
  const utf8Bytes = encoder.encode(str);

  return Array.from(utf8Bytes);
};

/**
 * 获取Unicode编码
 * @param str 目标字符串
 */

const getUnicode = (str: string): number[] => {
  const result = [];
  for (let i = 0; i < str.length; i++) {
    result.push(str.charCodeAt(i)); // 输出每个字符的 Unicode 编码
  }
  return result;
};

/**
 * Unicode 编码转换为 utf8 字节数组
 * • 0x0000 到 0x007F：1 个字节 格式： 0xxxxxxx
 * • 0x0080 到 0x07FF：2 个字节 格式： 110xxxxx 10xxxxxx
 * • 0x0800 到 0xFFFF：3 个字节 格式： 1110xxxx 10xxxxxx 10xxxxxx
 * • 0x10000 到 0x10FFFF：4 个字节• 格式： 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
 */
function unicodeToUTF8(codePoint: number): number[] {
  const utf8Bytes = [];

  if (codePoint <= 0x7f) {
    // 1 字节
    utf8Bytes.push(codePoint);
  } else if (codePoint <= 0x7ff) {
    // 2 字节
    utf8Bytes.push(((codePoint >> 6) & 0x1f) | 0xc0);
    utf8Bytes.push((codePoint & 0x3f) | 0x80);
  } else if (codePoint <= 0xffff) {
    // 3 字节
    utf8Bytes.push(((codePoint >> 12) & 0x0f) | 0xe0);
    utf8Bytes.push(((codePoint >> 6) & 0x3f) | 0x80);
    utf8Bytes.push((codePoint & 0x3f) | 0x80);
  } else if (codePoint <= 0x10ffff) {
    // 4 字节
    utf8Bytes.push(((codePoint >> 18) & 0x07) | 0xf0);
    utf8Bytes.push(((codePoint >> 12) & 0x3f) | 0x80);
    utf8Bytes.push(((codePoint >> 6) & 0x3f) | 0x80);
    utf8Bytes.push((codePoint & 0x3f) | 0x80);
  } else {
    throw new Error("Invalid Unicode code point");
  }

  return utf8Bytes;
}

const res = unicodeToUTF8(getUnicode("h")?.[0]);
console.log(res, "res");
